package main

import (
	"flag"
	"fmt"
	"gitee.com/wuxiesoft/go-learning-notes/source/learning3/config"
	"math"
	"os"
	"unicode/utf8"
)

type Printer interface {
	Print(interface{})
}

type FuncCaller func(p interface{})

func (funcCaller FuncCaller) Print(p interface{}) {
	funcCaller(p)
}

func main() {
	var h bool
	flag.BoolVar(&h, "h", false, "帮助")
	opsType := flag.String("opsType", "add", "配置类型") //返回指针
	opsLength := flag.Int("opsLength", 4, "配置长度")    //返回指针
	var opsDesc string
	flag.StringVar(&opsDesc, "opsDesc", "新增", "配置说明")
	flag.Parse() //解析参数
	fmt.Printf("opsType: %v,opsLength: %v,opsDesc: %v \n", *opsType, *opsLength, opsDesc)

	if h {
		fmt.Fprintf(os.Stderr, `demo version: demo/1.10.0
Usage: demo [-h] [-opsType=""] [-opsLength=] [-opsDesc=""]
Options:
`)
		flag.PrintDefaults()
	}

	fmt.Printf("版本：%v\n", config.Version)

	var printer Printer
	printer = FuncCaller(func(p interface{}) {
		fmt.Println(p)
	})
	printer.Print("函数实现接口")

	//声明
	var id int = 100
	var name string = "伍邪"
	idx := 1
	fmt.Printf("id value: %v \n", id)
	fmt.Printf("name value: %v \n", name)
	fmt.Printf("idx value: %v \n", idx)

	//整数
	var u16 uint16 = math.MaxUint8 + 1
	fmt.Printf("u16 value is: %v \n", u16)
	var u8 = uint8(u16)
	fmt.Printf("u8 value is: %v \n", u8)
	u8a := 6
	var u16a = uint16(u8a)
	fmt.Printf("u8a value is: %v,u16a value is: %v \n", u8a, u16a)

	//浮点,输出配置“%f”格式使用
	fmt.Printf("%f\n", math.E)
	fmt.Printf("%.2f\n", math.E)

	//字符串
	//长度计算
	str := "hello老王"
	fmt.Printf("字节长度： %v \n", len(str))
	fmt.Printf("rune长度： %v \n", utf8.RuneCountInString(str))
	//循环,字节
	for _, b := range []byte(str) {
		fmt.Printf("%c", b)
	}
	fmt.Println()
	//循环字符
	for _, c := range str {
		fmt.Printf("%c", c)
	}

	//指针
	//声明一个字符串
	fmt.Println()
	strA := "你是人好人"
	strAPrt := &strA //获取字符串指针，内存地址
	fmt.Printf("类型： %T,值：%v \n", strA, strA)
	fmt.Printf("类型： %T,值：%v \n", strAPrt, strAPrt)
	strAPrtPtr := &strAPrt //获取指针的指针，内存地址
	fmt.Printf("类型： %T,值：%v \n", strAPrtPtr, strAPrtPtr)
	//类型： string,值：你是人好人
	//类型： *string,值：0xc000036200
	//类型： **string,值：0xc000006030

	//通过指针操作变量值
	strB := "你是个好人"
	strBPtr := &strB //获取指针
	fmt.Printf("strB类型： %T,strB值：%v \n", strB, strB)
	fmt.Printf("strBPtr类型： %T,strBPtr值：%v \n", strBPtr, strBPtr)

	strC := *strBPtr //获取指针对应变量的值，赋值给新变量，相当于将指针指向的变量的值赋值给新变量
	fmt.Printf("strC类型： %T,strC值：%v \n", strC, strC)

	*strBPtr = "他也是个好人" //通过指针对对应变量进行赋值,不会影响strC的值
	fmt.Printf("strC类型： %T,strC值：%v \n", strC, strC)
	fmt.Printf("strB类型： %T,strB值：%v \n", strB, strB)
	//strB类型： string,strB值：你是个好人
	//strBPtr类型： *string,strBPtr值：0xc000036230
	//strC类型： string,strC值：你是个好人
	//strC类型： string,strC值：你是个好人
	//strB类型： string,strB值：他也是个好人

	hello()
	config.Execute()
}
